mod front_of_house;
mod back_of_house;

use crate::front_of_house::hosting;
use crate::front_of_house::hosting::add_to_waitlist;
use std::collections::HashMap;
use crate::back_of_house::Breakfast;
use crate::back_of_house::Appetizer;

pub fn eat_at_resturant() {
    // absolute
    hosting::add_to_waitlist(); // 我们可以通过use来引入，防止写入一大长串内容

    add_to_waitlist(); // 我们也可以用use，直接写到需要的函数那里，但是一般不这么做，因为我们可以通过函数的父组件知道自己使用的不是自己的函数
    let mut map = HashMap::new(); // 但是模块里边的一些struct和enum什么的一般会直接引进来使用，比如Hashmap
    map.insert(1, 2);
    // relative
    front_of_house::hosting::add_to_waitlist();

    let meal = Breakfast::summer("Rye");
    println!("I'd like {} toast please!", meal.toast);

    let order = Appetizer::Salad; // enum的属性默认都是pub的
}

use std::io::Result as IoResult;
use std::fmt::Result as FmtResult; // 我们可以使用as来做别名，可以防止两个相同名字的重复


// 在A中引用hosting，那么hosting仅仅对于A这个scope是private的，其他人调用A是没法访问到hosting的
// 当然可以通过resturant::front_of_house::hosting::add_to_waitlist() 访问到函数，如果都是pub的话
// 现在我们可以通过pub use 来修饰，使得hosting处于resturant的根路径下，我们可以直接resturant::hosting::add_to_waitlist()访问
// pub use crate::front_of_house::hosting; 

// 两种模块风格：src/back_of_house.rs 和 src/back_of_house/mod.rs(旧风格) 这两种都可以，但是同一个mod不可以用两种风格会报错，不同的mod可以混着用，但是推荐使用第一种